﻿Imports Microsoft.DirectX.Direct3D
Imports Microsoft.DirectX
Public Class ObjektPfeil
    Private Sprit As Integer

    Public Property TreibstoffVerbrauch() As Integer
        Get
            Return Sprit
        End Get
        Set(ByVal value As Integer)
            Sprit = value
        End Set
    End Property
    Public Sub New()
        If My.Settings.draw3D Then
            If PfeilMeshN Is Nothing Then
                'Ansonsten brauchen wir das doch nicht zu laden oder?
                PfeilMeshN = New Objekt3D()
                PfeilMeshN.MeshBildLaden(My.Settings.Resourcenpfad + "Pfeile\PfeilN.x")
                PfeilMeshNS = New Objekt3D()
                PfeilMeshNS.MeshBildLaden(My.Settings.Resourcenpfad + "Pfeile\PfeilNS.x")
                PfeilMeshNO = New Objekt3D()
                PfeilMeshNO.MeshBildLaden(My.Settings.Resourcenpfad + "Pfeile\PfeilNO.x")
            End If
        Else
            If Hauptmenü.ZoomedIn Then
                PfeilTextur = Grafikengine.LoadTexture(My.Settings.Resourcenpfad + "Pfeile\Zoomed In\Pfeil+Einheiten.png")
            Else
                PfeilTextur = Grafikengine.LoadTexture(My.Settings.Resourcenpfad + "Pfeile\Zoomed Out\Pfeil+Einheiten.png")
            End If
        End If
    End Sub
    Shared PfeilMeshN As Objekt3D = Nothing
    Shared PfeilMeshNS As Objekt3D = Nothing
    Shared PfeilMeshNO As Objekt3D = Nothing

    Dim PfeilTextur As Texture
    Enum PfeilRichtungen
        LinksRechts
        ObenUnten
        ObenRechts
        ObenLinks
        UntenRechts
        UntenLinks
        Rechts
        Links
        Oben
        Unten
    End Enum
    Dim Pfeile() As PfeilRichtungen = {}
    Dim WegpunkteX() As Integer = {}
    Dim WegpunkteY() As Integer = {}
    Public Sub PfeilAktualisieren(ByVal X As Integer, ByVal Y As Integer)
        If Objektverwalter.Spielfeld.OnMap(X, Y) Then
            If IsErreichbar(X, Y) Then
                If WegpunkteX.Length = 0 Then
                    If Objektverwalter.Spielfeld.Wegsuchsystem.getBewegungspunktekosten(X, Y) > 0 Then
                        Objektverwalter.Spielfeld.Wegsuchsystem.Ziel(X, Y, Objektverwalter.Spielfeld.MomentaneSchlacht, True, , False)
                        Sprit = Objektverwalter.Spielfeld.Wegsuchsystem.getBewegungspunktekosten(X, Y)
                        WegpunkteX = Objektverwalter.Spielfeld.Wegsuchsystem.WegpunkteX
                        WegpunkteY = Objektverwalter.Spielfeld.Wegsuchsystem.WegpunkteY
                        Pfeileerschaffen()
                    ElseIf Objektverwalter.Spielfeld.Wegsuchsystem.getBewegungspunktekosten(X, Y) = 0 Then
                        Sprit = 0
                        Array.Resize(WegpunkteX, 0)
                        Array.Resize(WegpunkteY, 0)
                        Array.Resize(Objektverwalter.Spielfeld.Wegsuchsystem.WegpunkteX, 0)
                        Array.Resize(Objektverwalter.Spielfeld.Wegsuchsystem.WegpunkteY, 0)
                        Array.Resize(Pfeile, 0)
                    Else
                        Sprit = 0
                        Array.Resize(WegpunkteX, 0)
                        Array.Resize(WegpunkteY, 0)
                        Array.Resize(Objektverwalter.Spielfeld.Wegsuchsystem.WegpunkteX, 0)
                        Array.Resize(Objektverwalter.Spielfeld.Wegsuchsystem.WegpunkteY, 0)
                        Array.Resize(Pfeile, 0)
                    End If
                Else
                    If WegpunkteX(0) = X And WegpunkteY(0) = Y Then
                        'Wir sind auf dem selben Feld
                    Else
                        If Objektverwalter.Spielfeld.Wegsuchsystem.getBewegungspunktekosten(X, Y) > 0 Then

                            If Pfeile.Length = 0 Or FeldschonBelaufen(X, Y) = True Then
                                Objektverwalter.Spielfeld.Wegsuchsystem.Ziel(X, Y, Objektverwalter.Spielfeld.MomentaneSchlacht, True, , False)
                                Sprit = Objektverwalter.Spielfeld.Wegsuchsystem.getBewegungspunktekosten(X, Y)
                                WegpunkteX = Objektverwalter.Spielfeld.Wegsuchsystem.WegpunkteX
                                WegpunkteY = Objektverwalter.Spielfeld.Wegsuchsystem.WegpunkteY
                                Pfeileerschaffen()
                            Else
                                If TreibstoffVerbrauch + Objektverwalter.Bewegungskosten(Objektverwalter.Spielfeld.AktuelleEinheit, Objektverwalter.Spielfeld.Landschaften(X, Y, Objektverwalter.Spielfeld.MomentaneSchlacht).getID, Objektverwalter.Spielfeld.Regeln.Wetter, X, Y) <= Objektverwalter.Spielfeld.AktuelleEinheit.GetMovementRange Then
                                    If WegpunkteX(0) = X And WegpunkteY(0) = Y + 1 Then
                                        FeldHinzufügen(X, Y)
                                    ElseIf WegpunkteX(0) = X And WegpunkteY(0) = Y - 1 Then
                                        FeldHinzufügen(X, Y)
                                    ElseIf WegpunkteX(0) = X + 1 And WegpunkteY(0) = Y Then
                                        FeldHinzufügen(X, Y)
                                    ElseIf WegpunkteX(0) = X - 1 And WegpunkteY(0) = Y Then
                                        FeldHinzufügen(X, Y)
                                    Else
                                        Objektverwalter.Spielfeld.Wegsuchsystem.Ziel(X, Y, Objektverwalter.Spielfeld.MomentaneSchlacht, True, , False)
                                        Sprit = Objektverwalter.Spielfeld.Wegsuchsystem.getBewegungspunktekosten(X, Y)
                                        WegpunkteX = Objektverwalter.Spielfeld.Wegsuchsystem.WegpunkteX
                                        WegpunkteY = Objektverwalter.Spielfeld.Wegsuchsystem.WegpunkteY
                                        Pfeileerschaffen()
                                    End If
                                Else
                                    Objektverwalter.Spielfeld.Wegsuchsystem.Ziel(X, Y, Objektverwalter.Spielfeld.MomentaneSchlacht, True, , False)
                                    Sprit = Objektverwalter.Spielfeld.Wegsuchsystem.getBewegungspunktekosten(X, Y)
                                    WegpunkteX = Objektverwalter.Spielfeld.Wegsuchsystem.WegpunkteX
                                    WegpunkteY = Objektverwalter.Spielfeld.Wegsuchsystem.WegpunkteY
                                    Pfeileerschaffen()
                                End If
                            End If
                        ElseIf Objektverwalter.Spielfeld.Wegsuchsystem.getBewegungspunktekosten(X, Y) = 0 Then
                            Sprit = 0
                            Array.Resize(WegpunkteX, 0)
                            Array.Resize(WegpunkteY, 0)
                            Array.Resize(Objektverwalter.Spielfeld.Wegsuchsystem.WegpunkteX, 0)
                            Array.Resize(Objektverwalter.Spielfeld.Wegsuchsystem.WegpunkteY, 0)
                            Array.Resize(Pfeile, 0)
                        Else
                            Sprit = 0
                            Array.Resize(WegpunkteX, 0)
                            Array.Resize(WegpunkteY, 0)
                            Array.Resize(Objektverwalter.Spielfeld.Wegsuchsystem.WegpunkteX, 0)
                            Array.Resize(Objektverwalter.Spielfeld.Wegsuchsystem.WegpunkteY, 0)
                            Array.Resize(Pfeile, 0)
                        End If
                    End If
                End If
            Else
                Sprit = 0
                Array.Resize(WegpunkteX, 0)
                Array.Resize(WegpunkteY, 0)
                Array.Resize(Objektverwalter.Spielfeld.Wegsuchsystem.WegpunkteX, 0)
                Array.Resize(Objektverwalter.Spielfeld.Wegsuchsystem.WegpunkteY, 0)
                Array.Resize(Pfeile, 0)
            End If
        Else
            Sprit = 0
            Array.Resize(WegpunkteX, 0)
            Array.Resize(WegpunkteY, 0)
            Array.Resize(Objektverwalter.Spielfeld.Wegsuchsystem.WegpunkteX, 0)
            Array.Resize(Objektverwalter.Spielfeld.Wegsuchsystem.WegpunkteY, 0)
            Array.Resize(Pfeile, 0)
        End If
    End Sub
    Private Function IsErreichbar(ByVal X As Integer, ByVal Y As Integer) As Boolean
        Dim Bewegunspunkte As Integer = Objektverwalter.Spielfeld.AktuelleEinheit.GetMovementRange()
        If Objektverwalter.Spielfeld.Wegsuchsystem.getBewegungspunktekosten(X, Y) <= Bewegunspunkte Then
            Return True
        ElseIf Objektverwalter.Spielfeld.Wegsuchsystem.GetBewegungspunktekostenReal(X, Y, Objektverwalter.Spielfeld.AktuelleEinheit.GetMap) <= Bewegunspunkte Then
            Dim E As ObjektEinheit = Objektverwalter.Spielfeld.Einheiten(X, Y, Objektverwalter.Spielfeld.AktuelleEinheit.GetMap)
            If E IsNot Nothing Then
                If E.GetSpieler.Team = Objektverwalter.Spielfeld.AktuellerSpieler.Team Then
                    Return True
                End If
            End If
        End If
        Return False
    End Function
    Public Sub Malen()
        If Objektverwalter.Spielfeld.AktuellerSpieler.KIStufe = ObjektSpieler.KIStufen.Mensch Then
            If My.Settings.draw3D Then
                Grafikengine.Sprite.End()
                For I = 0 To Pfeile.Length - 1
                    Dim obj As Objekt3D = Nothing
                    Dim Mat As Matrix
                    Select Case Pfeile(I)
                        Case PfeilRichtungen.Unten 'Die 4 Himmelsrichtungen sind ja immer genau vertauscht!
                            obj = PfeilMeshN
                            Mat = Matrix.RotationY(0)
                        Case PfeilRichtungen.Oben
                            obj = PfeilMeshN
                            Mat = Matrix.RotationY(Math.PI)
                        Case PfeilRichtungen.Links
                            obj = PfeilMeshN
                            Mat = Matrix.RotationY(Math.PI / 2)
                        Case PfeilRichtungen.Rechts
                            obj = PfeilMeshN
                            Mat = Matrix.RotationY(Math.PI * 3 / 2)

                        Case PfeilRichtungen.ObenUnten
                            obj = PfeilMeshNS
                            Mat = Matrix.RotationY(0)
                        Case PfeilRichtungen.LinksRechts
                            obj = PfeilMeshNS
                            Mat = Matrix.RotationY(Math.PI / 2)

                        Case PfeilRichtungen.ObenRechts
                            obj = PfeilMeshNO
                            Mat = Matrix.RotationY(0)
                        Case PfeilRichtungen.ObenLinks
                            obj = PfeilMeshNO
                            Mat = Matrix.RotationY(Math.PI * 3 / 2)
                        Case PfeilRichtungen.UntenRechts
                            obj = PfeilMeshNO
                            Mat = Matrix.RotationY(Math.PI / 2)
                        Case PfeilRichtungen.UntenLinks
                            obj = PfeilMeshNO
                            Mat = Matrix.RotationY(Math.PI)
                    End Select
                    Mat.M41 = WegpunkteX(I) + 0.5
                    Mat.M42 = Objektverwalter.LandschaftenBilder(Objektverwalter.Spielfeld.Landschaften(WegpunkteX(I), WegpunkteY(I), 0).ID).getFigurPos(ObjektLandschaftsTextur.Positionsarten.Boden).Y 'naja eigentlich wohl am besten da, wo die Bodeneinheiten draufgehören.
                    Mat.M43 = -WegpunkteY(I) + 0.5
                    obj.Malen(Mat)
                Next
                Grafikengine.Sprite.Begin(SpriteFlags.AlphaBlend)
            Else

                'Welchen Teil des Bildes wir malen wollen
                Dim sngRotation As Double = 0
                Dim intColor As Color = Color.FromArgb(255, 255, 255, 255)
                'prüfen ob wir aus den Screenbereich laufen
                With Grafikengine.ptfRotCenter
                    .X = Hauptmenü.Feldbreite / 2
                    .Y = Hauptmenü.Feldbreite / 2
                End With
                With Grafikengine.szfScale
                    .Height = Hauptmenü.Feldbreite
                    .Width = Hauptmenü.Feldbreite
                End With

                For I = 0 To Pfeile.Length - 1
                    With Grafikengine.recBild
                        .X = Hauptmenü.Feldbreite * Pfeile(I) : .Width = Hauptmenü.Feldbreite
                        .Y = 0 : .Height = Hauptmenü.Feldbreite
                    End With
                    'Falls der Zoomfaktor größer 1 ist müssen einige Ränder abgeschnitten werden
                    Grafikengine.ptfPosition = New Drawing.Point(Hauptmenü.Feldbreite * WegpunkteX(I) + Objektverwalter.Spielfeld.BildschirmKooX, Hauptmenü.Feldbreite * WegpunkteY(I) + Objektverwalter.Spielfeld.BildschirmKooY)
                    'jetzt wird es in den Backbuffer gezeichnet
                    Grafikengine.Sprite.Draw2D(PfeilTextur, Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intColor)
                Next
            End If
        End If
    End Sub
    Private Sub Pfeileerschaffen()
        ' If WegpunkteX.Length = 0 Then Exit Sub
        Array.Resize(Pfeile, WegpunkteX.Length - 1)
        For I = 0 To WegpunkteX.Length - 2
            If I = 0 Then
                If WegpunkteX(I) > WegpunkteX(I + 1) Then
                    Pfeile(I) = PfeilRichtungen.Links
                ElseIf WegpunkteX(I) < WegpunkteX(I + 1) Then
                    Pfeile(I) = PfeilRichtungen.Rechts
                ElseIf WegpunkteY(I) > WegpunkteY(I + 1) Then
                    Pfeile(I) = PfeilRichtungen.Oben
                ElseIf WegpunkteY(I) < WegpunkteY(I + 1) Then
                    Pfeile(I) = PfeilRichtungen.Unten
                End If
            Else
                If WegpunkteX(I) > WegpunkteX(I + 1) Then
                    If WegpunkteX(I) < WegpunkteX(I - 1) Then
                        Pfeile(I) = PfeilRichtungen.LinksRechts
                    ElseIf WegpunkteY(I) > WegpunkteY(I - 1) Then
                        Pfeile(I) = PfeilRichtungen.ObenLinks
                    ElseIf WegpunkteY(I) < WegpunkteY(I - 1) Then
                        Pfeile(I) = PfeilRichtungen.UntenLinks
                    End If
                ElseIf WegpunkteX(I) < WegpunkteX(I + 1) Then
                    If WegpunkteX(I) > WegpunkteX(I - 1) Then
                        Pfeile(I) = PfeilRichtungen.LinksRechts
                    ElseIf WegpunkteY(I) > WegpunkteY(I - 1) Then
                        Pfeile(I) = PfeilRichtungen.ObenRechts
                    ElseIf WegpunkteY(I) < WegpunkteY(I - 1) Then
                        Pfeile(I) = PfeilRichtungen.UntenRechts
                    End If
                ElseIf WegpunkteY(I) > WegpunkteY(I + 1) Then
                    If WegpunkteX(I) < WegpunkteX(I - 1) Then
                        Pfeile(I) = PfeilRichtungen.ObenRechts
                    ElseIf WegpunkteX(I) > WegpunkteX(I - 1) Then
                        Pfeile(I) = PfeilRichtungen.ObenLinks
                    ElseIf WegpunkteY(I) < WegpunkteY(I - 1) Then
                        Pfeile(I) = PfeilRichtungen.ObenUnten
                    End If
                ElseIf WegpunkteY(I) < WegpunkteY(I + 1) Then
                    If WegpunkteX(I) < WegpunkteX(I - 1) Then
                        Pfeile(I) = PfeilRichtungen.UntenRechts
                    ElseIf WegpunkteX(I) > WegpunkteX(I - 1) Then
                        Pfeile(I) = PfeilRichtungen.UntenLinks
                    ElseIf WegpunkteY(I) > WegpunkteY(I - 1) Then
                        Pfeile(I) = PfeilRichtungen.ObenUnten
                    End If

                End If
            End If
        Next
    End Sub
    Private Sub FeldHinzufügen(ByVal X As Integer, ByVal Y As Integer)
        Array.Resize(WegpunkteX, WegpunkteX.Length + 1)
        Array.Resize(WegpunkteY, WegpunkteX.Length)
        For I = 1 To WegpunkteX.Length - 1
            WegpunkteX(WegpunkteX.Length - I) = WegpunkteX(WegpunkteX.Length - I - 1)
            WegpunkteY(WegpunkteY.Length - I) = WegpunkteY(WegpunkteY.Length - I - 1)
        Next
        Sprit += Objektverwalter.Bewegungskosten(Objektverwalter.Spielfeld.AktuelleEinheit, Objektverwalter.Spielfeld.Landschaften(X, Y, Objektverwalter.Spielfeld.MomentaneSchlacht).getID, Objektverwalter.Spielfeld.Regeln.Wetter, X, Y)
        WegpunkteX(0) = X
        WegpunkteY(0) = Y
        Objektverwalter.Spielfeld.Wegsuchsystem.WegpunkteX = WegpunkteX
        Objektverwalter.Spielfeld.Wegsuchsystem.WegpunkteY = WegpunkteY
        Pfeileerschaffen()
    End Sub
    Private Function FeldschonBelaufen(ByVal X As Integer, ByVal Y As Integer) As Boolean
        For I = 0 To WegpunkteX.Length - 1
            If WegpunkteX(I) = X And WegpunkteY(I) = Y Then
                Return True
            End If
        Next
        Return False
    End Function
End Class
